package com.example.demo.basics.lambda;

import java.io.BufferedReader;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * LambdaTest
 *
 * @author chenchao
 * @date 2021/8/31
 */
public class LambdaTest {
    public static void main(String[] args) {
        /**
         * @FunctionalInterface 修饰的函数接口
         * () -> {}   ()入参  -> lambda表达式 {}主体  一个参数时候大括号中括号可取消
         * Runnable
         * Function
         * Consumer
         * Predicate 进行筛滤操作
         * */
        Runnable r1 = () -> {System.out.println("Hello Lambda!");};
        Object obj = (Runnable) () -> System.out.println("Hello Lambda!");
        System.out.println((Runnable) () -> System.out.println("666"));
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
        Stream.generate(Math::random).limit(2).forEach(System.out::println);
        /**
         * 功能描述
         *2.1 筛选与切片
         * 　　filter：过滤流中的某些元素
         * 　　limit(n)：获取n个元素
         * 　　skip(n)：跳过n元素，配合limit(n)可实现分页
         * 　　distinct：通过流中元素的 hashCode() 和 equals() 去除重复元素
         */
        List<String> list = Arrays.asList("a,b,c", "1,2,3");
        list.forEach(System.out::println);
        Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", ""));
        list.stream().flatMap(s -> Arrays.stream(s.split(","))).forEach(System.out::println);
        /**
         * 　　allMatch：接收一个 Predicate 函数，当流中每个元素都符合该断言时才返回true，否则返回false
         * 　　noneMatch：接收一个 Predicate 函数，当流中每个元素都不符合该断言时才返回true，否则返回false
         * 　　anyMatch：接收一个 Predicate 函数，只要流中有一个元素满足该断言则返回true，否则返回false
         * 　　findFirst：返回流中第一个元素
         * 　　findAny：返回流中的任意元素
         * 　　count：返回流中元素的总个数
         * 　　max：返回流中元素最大值
         * 　　min：返回流中元素最小值
         * */
//        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
//        boolean allMatch = list.stream().allMatch(e -> e > 10); //false
//        boolean noneMatch = list.stream().noneMatch(e -> e > 10); //true
//        boolean anyMatch = list.stream().anyMatch(e -> e > 4); //true
//        Integer findFirst = list.stream().findFirst().get(); //1
//        Integer findAny = list.stream().findAny().get(); //1
//        long count = list.stream().count(); //5
//        Integer max = list.stream().max(Integer::compareTo).get(); //5
//        Integer min = list.stream().min(Integer::compareTo).get(); //1

        List<Integer> aa = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        System.out.println(aa.stream().reduce((x1, x2) -> x1 + x2).get());
        Integer v1 = aa.stream().reduce(10, (x1, x2) -> x1 + x2);
        System.out.println(v1); //310
//        Collectors.counting()
//        Collectors.joining
//        Collectors.toMap
//        minBy
//        Collectors.maxBy()
        //     Collectors.summingInt()
        //averagingDouble
// 带上以上所有方法
//        DoubleSummaryStatistics statistics = list.stream().collect(Collectors.summarizingDouble(Student::getAge));
//        System.out.println("count:" + statistics.getCount() + ",max:" + statistics.getMax() + ",sum:" + statistics.getSum() + ",average:" + statistics.getAverage());
//
        //groupingBy
        //多重分组
        //Collectors.groupingBy(Student::getType, Collectors.groupingBy(Student::getAge))
        //分成两部分，一部分大于10岁，一部分小于等于10岁
        //Collectors.partitioningBy(v -> v.getAge() > 10)
        //规约
        //Collectors.reducing(Integer::sum)

        //统计
        // List<Map>
//        int max = list.stream().mapToInt(
//                m -> m.get("number") != null ? Integer.parseInt(m.get("number").toString()) : 0
//        ).max().getAsInt();
//        // List<Map>
//        int min = list.stream().mapToInt(
//                m -> m.get("number") != null ? Integer.parseInt(m.get("number").toString()) : 0
//        ).min().getAsInt();
//        //取总和
//        // List<对象>
//        (int)list.stream().mapToInt(n -> n.getClickNum()).summaryStatistics().getSum();
//        // List<Map>
//        int sum = list.stream().mapToInt(
//                m -> m.get("number") != null ? Integer.parseInt(m.get("number").toString()) : 0
//        ).sum();

        //平均值
        // List<Map>
//        double avg = list.stream().mapToInt(
//            m -> m.get("number") != null ? Integer.parseInt(m.get("number").toString()) : 0
//        ).average().getAsDouble();
        //获取最近时间
//        long date = list.stream().filter(x -> x!=null).filter(y -> y.getNewReplyTime()!=null).mapToLong(n -> n.getNewReplyTime().getTime()).summaryStatistics().getMax();
//        if(date>0) forumPlateVo.setNewReplyTime(new Date(date));
        //排序

//        // Comparator.comparing(排序字段)  reversed() 倒序
//        List list = list.stream().sorted(Comparator.comparing(ForumPlateVo::clickNum).reversed()).collect(Collectors.toList());
//
//将 List<Map> 按照热力值进行倒序：Comparator.comparing(取元素值m) -> 转为整数    进而排序
//        List<Map> list = (List<Map>) topList.stream().sorted(Comparator.comparing((Map<String, Object> m) -> (Integer.parseInt(m.get("heatvalue").toString()))).reversed()).collect(Collectors.toList());
        //分组

//        // List<对象>
//        int count = list.stream().collect(Collectors.groupingBy(ActivityLottery::getOpenId)).size();
//
// List<Map>
// 两列：去重的用户团标识和团中用户数量
//        Map<Object, Long> ucMaps = list.stream().collect(Collectors.groupingBy(e -> e.get("usercliqueId"), Collectors.counting()));


        // List<对象>
        // int count = list.stream().collect(Collectors.groupingBy(ActivityLottery::getOpenId)).size();

        //
        // List<对象>
//        int count = list.stream().collect(Collectors.groupingBy(ActivityLottery::getOpenId)).size();
//
// List<Map>
// 两列：去重的用户团标识和团中用户数量
//        Map<Object, Long> ucMaps = list.stream().collect(Collectors.groupingBy(e -> e.get("usercliqueId"), Collectors.counting()));

    }

}
